/**
*
*/
package vnet.sms.gateway.nettytest.embedded;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.concurrent.Future;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import com.google.common.base.Predicate;
/**
* @author obergner
*
*/
class DefaultMessageEvents implements MessageEvents,
ChannelListener<MessageEvent> {
private final FilteredChannelEventQueue<MessageEvent> channelEvents = new FilteredChannelEventQueue<MessageEvent>();
DefaultMessageEvents() {
}
// ------------------------------------------------------------------------
// ChannelListener
// ------------------------------------------------------------------------
@Override
public void onEvent(final MessageEvent e) {
this.channelEvents.onEvent(e);
}
@Override
public void onExceptionEvent(final ExceptionEvent e) {
this.channelEvents.onExceptionEvent(e);
}
// ------------------------------------------------------------------------
// ChannelEvents
// ------------------------------------------------------------------------
@Override
public boolean isEmpty() {
return this.channelEvents.isEmpty();
}
/**
* @see java.lang.Iterable#iterator()
*/
@Override
public Iterator<MessageEvent> iterator() {
return this.channelEvents.iterator();
}
@Override
public Future<MessageEvent> waitForMatchingMessageEvent(
final Predicate<MessageEvent> predicate) {
return this.channelEvents.addFilter(new Predicate<MessageEvent>() {
@Override
public boolean apply(final MessageEvent input) {
return MessageEvent.class.isInstance(input)
&& predicate.apply(MessageEvent.class.cast(input));
}
});
}
@Override
public TimedFuture<MessageEvent> timedWaitForMatchingMessageEvent(
final Predicate<MessageEvent> predicate) {
return this.channelEvents.addTimedFilter(new Predicate<MessageEvent>() {
@Override
public boolean apply(final MessageEvent input) {
return MessageEvent.class.isInstance(input)
&& predicate.apply(MessageEvent.class.cast(input));
}
});
}
/**
* @see vnet.sms.gateway.nettytest.embedded.MessageEvents#nextMessageEvent()
*/
@Override
public MessageEvent nextMessageEvent() {
return this.channelEvents.poll();
}
/**
* @see vnet.sms.gateway.nettytest.embedded.MessageEvents#nextMatchingMessageEvent(vnet.sms.gateway.nettytest.embedded.MessageEventFilter)
*/
@Override
public MessageEvent nextMatchingMessageEvent(
final Predicate<MessageEvent> predicate) {
for (final MessageEvent candidate : this.channelEvents) {
if (predicate.apply(candidate)) {
this.channelEvents.remove(candidate);
return candidate;
}
}
return null;
}
/**
* @see vnet.sms.gateway.nettytest.embedded.MessageEvents#allMessageEvents()
*/
@Override
public MessageEvent[] allMessageEvents() {
final int size = this.channelEvents.size();
final MessageEvent[] a = new MessageEvent[size];
for (int i = 0; i < size; i++) {
final MessageEvent product = nextMessageEvent();
if (product == null) {
throw new ConcurrentModificationException();
}
a[i] = product;
}
return a;
}
// ------------------------------------------------------------------------
// toString
// ------------------------------------------------------------------------
@Override
public String toString() {
return "DefaultMessageEvents@" + this.hashCode() + "[channelEvents: "
+ this.channelEvents + "]";
}
}